/* 
 * File:   FileService.cpp
 * Author: maximiliano
 * 
 * Created on 28 de mayo de 2013, 19:42
 */

#include "server_FileService.h"
#include "common_ProtocoloConstantes.h"
#include "FileService.h"
using namespace TP;

#define COMANDO_INVALIDO 0
#define FILE_SERVICE "FILE_SERVICE"
#define MTD_DECLARE_FILE "DECLARE_FILE"
#define MTD_PUT_FILE_CHUNK "PUT_FILE_CHUNK"
#define MTD_DEFINE_FILE "DEFINE_FILE"

FileService::FileService() {
}

FileService::~FileService() {
}

void FileService::parseMensaje (vector<string> & pComando, const string& pMensaje){

    std::stringstream ssParametros (pMensaje);
    string strParametro = "";
    
    while (std::getline(ssParametros, strParametro, SEPARADOR_CAMPO))
    {
        std::stringstream ssHelper;
        ssHelper << strParametro;
        strParametro = "";
        ssHelper >> strParametro;

        if (strParametro.length () > 0)
        {
            pComando.push_back(strParametro);
        }
    }
    
    if (pComando.size() == 0)
    {
        // Comando no definido.
        throw COMANDO_INVALIDO;
    }
}

void FileService::mensajeEntranteManejador (IMensajero* pMensajero, const string& pMensaje) throw (int) {
    // El valor de retorno es error hasta que se demuestre lo contrario.
    string return_msg = ERROR;

    try
    {
        // Hidrato el comando.
        vector<string> comando;
        this->parseMensaje(comando, pMensaje);
        
        if (FILE_SERVICE != comando[0]) return;
        
        if (comando.size() < 2) throw COMANDO_INVALIDO;
        
        // Se determina a que comando corresponde el mensaje.
        if (PING == comando [1])
        {
            this->responderEco (pMensajero, comando);
        } 
        else if (MTD_DECLARE_FILE == comando[1])
        {
            this->DeclareFile (pMensajero, comando);
        }
        else if (MTD_DEFINE_FILE == comando[1])
        {
            this->DefineFile (pMensajero, comando);
        }
        else if (MTD_PUT_FILE_CHUNK == comando[1])
        {
            this->PutFileChunk (pMensajero, comando);
        }
        else
        {
            // Comando no definido => Error.
            throw COMANDO_INVALIDO;
        }
    }
    catch (int pEx)
    {
        try
        {
            if (COMANDO_INVALIDO == pEx)
                return_msg += SEPARADOR_CAMPO + "Comando invalido.";
            else
                return_msg += SEPARADOR_CAMPO + "Error desconocido.";
            
            pMensajero->Responder(return_msg);
        }
        catch (Excepcion& pEx)
        {
            cerr << pEx.what() << endl;
        }
    }
}

void FileService::responderEco(IMensajero* pMensajero, vector<string> &pComando) {
    pMensajero->Responder(OK);
}